package main;

import grafico.GerenteGUI;

import audio.AudioEvent;
import audio.AudioListener;
import audio.GerenteAudio;

import daisy.LivroDTB;

public class TocadorDaisy implements AudioListener
{
	static private TocadorDaisy instancia = null;
	
	private GerenteGUI gerente;
	private GerenteAudio audio;

	private LivroDTB livro;
	
	static final int MODO_PARADO    = 0;
	static final int MODO_CONTINUO  = 1;
	static final int MODO_PARAGRAFO = 2;
	private int modoAtual;
	
	boolean terminouFala;
	
	private TocadorDaisy()
	{
		modoAtual = MODO_PARADO;
		gerente = GerenteGUI.instancia();

		livro = LivroDTB.instancia();
		
		terminouFala = true;
		
		audio = GerenteAudio.instancia();
		audio.addAudioListener(this);
	}
	
	static public TocadorDaisy instancia()
	{
		if ( instancia == null )
			instancia = new TocadorDaisy();
		
		return instancia;
	}

	public void FimDeFala(AudioEvent e)
	{
		terminouFala = true;

System.out.println("Recebi um fim de fala!");

		if ( modoAtual != MODO_CONTINUO )
		{
			modoAtual = MODO_PARADO;
			gerente.setLayoutModoParado();
		}
		else
			tocarLivro();

	}

	@Override
	public void ErroAudio(AudioEvent e) 
	{
		// TODO Auto-generated method stub
	}
	
	public void reverteEstadoParagrafo()
	{
		if ( modoAtual != MODO_PARADO )
		{
			modoAtual = MODO_PARADO;
			audio.abortaAudio();
			gerente.setLayoutModoParado();
		}
		else
		{
			gerente.setLayoutModoParagrafo();
			tocarParagrafo();
		}
	}
	
	public void reverteEstadoContinuo()
	{
		if ( modoAtual != MODO_PARADO )
		{
			modoAtual = MODO_PARADO;
			audio.abortaAudio();
			gerente.setLayoutModoParado();
		}
		else
		{
			if ( !terminouFala )
				livro.voltaInicioParagrafo();

			gerente.setLayoutModoContinuo();

			tocarLivro();
		}
	}
	
	public void avancaSentenca()
	{
		if ( modoAtual != MODO_PARADO )
			audio.abortaAudio();

		modoAtual = MODO_PARAGRAFO;
		// livro.avancaUmaSentenca();

		gerente.setLayoutModoParagrafo();

		tocarParagrafo();
	}
	
	public void recuaSentenca()
	{
		if ( modoAtual != MODO_PARADO )
			audio.abortaAudio();

		modoAtual = MODO_PARAGRAFO;
		livro.voltaUmParagrafo();

		gerente.setLayoutModoParagrafo();

		tocarParagrafo();
	}
	
	public void abrirLivro()
	{
		String nomeArq = gerente.dlgAbrirArquivoOPF(".");
		
		if ( nomeArq != null )
		{
			if ( !livro.abrir(nomeArq) )
			{
				gerente.dlgAlerta("Erro ao abrir arquivo OPF!");
				return;
			}
			
			gerente.setLayoutModoContinuo();

			tocarLivro();
			
//			gerente.ativaBotaoStop();
		}
		else
			gerente.dlgAlerta("Nenhum arquivo selecionado!");
	}
	
	public String tiraTag(String texto)
	{
		boolean ignora;
		String str = "";
		
		ignora = false;
		for ( int i = 0; i < texto.length(); i++ )
		{
			if ( ignora )
			{
				ignora = (texto.charAt(i) != '>');
			}
			else
			{
				ignora = (texto.charAt(i) == '<');
				if ( !ignora )
					str += texto.charAt(i);
			}
		}
		
		return str;
	}
	
	public void tocarLivro()
	{
		String texto;
		
		if ( !livro.estaAberto() )
		{
			gerente.dlgAlerta("Nenhum livro carregado!");
			return;
		}
		
		if ( (texto = livro.proximoTexto()) != null )
		{
			terminouFala = false;
			modoAtual = MODO_CONTINUO;
			gerente.exibirTexto( texto );
			audio.tocarAudio( tiraTag(texto) );
		}
		else
		{
			modoAtual = MODO_PARADO;
			audio.tocarAudio("Fim do Livro");
		}
	}

	public void tocarParagrafo()
	{
		String texto;
		
		if ( !livro.estaAberto() )
		{
			gerente.dlgAlerta("Nenhum livro carregado!");
			return;
		}

		modoAtual = MODO_PARAGRAFO;
		
		if ( (texto = livro.proximoTexto()) != null )
		{
			terminouFala = false;
			modoAtual = MODO_PARAGRAFO;
			gerente.exibirTexto( texto );
			audio.tocarAudio( tiraTag(texto) );
		}
		else
		{
			modoAtual = MODO_PARADO;
			audio.tocarAudio("Fim do Livro");
		}
	}

	public void mostrarEstrutura()
	{
		if ( !livro.estaAberto() )
		{
			gerente.dlgAlerta("Nenhum livro carregado!");
			return;
		}
		
		modoAtual = MODO_PARADO;
		audio.abortaAudio();
		gerente.dlgMostraEstrutura( livro.montaEstruturaHTML() );
	}
}
